#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1600

typedef struct {
    int *data;      // 头指针
    int top;        // 栈顶元素
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack *obj=(MinStack *)malloc(sizeof(MinStack));    // 开辟头指针空间
    obj->data=(int *)malloc(MAXSIZE*sizeof(int));          // 开辟数组空间
    obj->top=-1;                                           // 栈顶下标。-1位特殊值，表示在第一个
    return obj;                                            // 返回该指针
}

void minStackPush(MinStack* obj, int x) {
  if(obj->top==MAXSIZE-1){
      // 如果数组满了，就什么也不做
  }else if(obj->top==-1){       // 判断是否是第一次入栈
    obj->top++;               // 让top+1，使其为0，数组第一个下标,可以与上一行合并为obj->data[++obj->top]=x;
    obj->data[obj->top]=x;    // 将元素存入数组
    obj->top++;               // 再将top+1，可以与下一行合并为obj->data[++obj->top]=x;
    obj->data[obj->top]=x;    // 因为栈为空，所以最小值肯定是第一个元素
  }else{
    int ymin=obj->data[obj->top++];   // 若不是第一次存入，拿出当前栈的最小值
    obj->data[obj->top]=x;            // 将元素入栈
    if(ymin<x) obj->data[++obj->top]=ymin;  // 判断最小值
    else obj->data[++obj->top]=x;
  }
}

void minStackPop(MinStack* obj) {
  if(obj->top==-1){
  }else{
      obj->top--;   
      obj->top--;     // 将top下标-2
  }
}

int minStackTop(MinStack* obj) {
  if(obj->top==-1){
      return 0;
  }
  return obj->data[obj->top-1];     // 栈顶元素
  
}

int minStackGetMin(MinStack* obj) {
  return obj->data[obj->top];       // 获取最小值
}

void minStackFree(MinStack* obj) {
    /*
     * 清空栈
     */
    free(obj->data);
    obj->data=NULL;
    free(obj);
    obj=NULL;
}

